#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "asa.h"
using namespace std;

int isNop(Stm *stm);
int comuta(Stm* exp, Stm* stm);

int getFlagCanonizouExp();
int getFlagCanonizouStm();
int setFlagCanonizouExp(int f);
int setFlagCanonizouStm(int f);

class VisitorCanonizador {
    public:
        void visit(ExpARI* exp);
        void visit(Stm* stm);
        //void visit(StmList* stmList);
        void visit(Global* global);
        void visit(Frame* frame);
        void visit(FrameMips* frameMips);
        void visit(Fragment* fragment);
        void visit(FragmentList* fragmentList);
        void visit(LiteralARI* literalARI);
        void visit(Procedure* procedure);
        void visit(ListaAcesso* listaAcesso);
        void visit(AcessoLocal* acessoLocal);
        void visit(InFrame* inFrame);
        void visit(InReg* inReg);
        void visit(Temp* temp);
        void visit(TempList* tempList);
        void visit(Label* label);
        void visit(LabelList* labelList);
        void visit(ExpARIList* expARIList);
        void visit(Const* c);
        void visit(ConstF* constF);
        void visit(Name* name);
        void visit(BinOp* binOp);
        void visit(Mem* mem);
        void visit(CallARI* callARI);
        void visit(Eseq* eseq);
        void visit(Move* move);
        void visit(Jump* jump);
        void visit(CJump* cJump);
        void visit(Seq* seq);
};
